﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;
using BillingExceptions;

namespace Billing
{
    class ServiceControl
    {
        /// <summary>
        /// Получаем статус состояния сервиса
        /// </summary>
        public ServiceControllerStatus ServiceStatus 
        {
            get {return _service.Status;}
        }
        public string ServiceStatusCaption
        {
            get
            {
                switch (_service.Status)
                {
                    case ServiceControllerStatus.ContinuePending:
                        return "Ожидается возобновление работы службы.";
                    case ServiceControllerStatus.PausePending:
                        return "Ожидается приостановка службы.";
                    case ServiceControllerStatus.Paused:
                        return "Ожидается приостановка службы.";
                    case ServiceControllerStatus.Running:
                        return "Служба запущена.";
                    case ServiceControllerStatus.StartPending:
                        return "Служба запускается.";
                    case ServiceControllerStatus.StopPending:
                        return "Служба останавливается.";
                    case ServiceControllerStatus.Stopped:
                        return "Служба не запущена.";
                    default:
                        return "";
                }
            }
        }

        public void StartService(string[] args)
        {
            _service.Start(args);
            _service.WaitForStatus(ServiceControllerStatus.Running);
            _service.Refresh();
        }

        public void StopService()
        {
            _service.Stop();
            _service.WaitForStatus(ServiceControllerStatus.Stopped);
            _service.Refresh();
        }

        /// <summary>
        /// Загружается экземпляр класса. Синглетон
        /// </summary>
        public static ServiceControl Item
        {
            get
            {
                if (_item == null)
                {
                    lock (_syncRoot)
                    {
                        if (_item == null)
                        {
                            _service = ServiceController.GetServices().Where(n => n.ServiceName == Properties.Settings.Default.ServiceName).ElementAt(0);
                            if (_service == null)
                                throw new BException(ErrType.Message, Properties.Resources.NotInstalledService);
                            _item = new ServiceControl();
                        }
                    }
                }
                return _item;
            }

        }

        #region Private

        private ServiceControl() { }
        private static ServiceControl _item;
        private static object _syncRoot = new Object();
        private static ServiceController _service;

        #endregion
    }
}
